<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>在不同版本之间迁移</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="warm-standby.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="backup.html">快退</a></td><td width="60%" align="center" valign="bottom">章23. 备份与恢复</td><td width="10%" align="right" valign="top"><a href="backup.html">快进</a></td><td width="10%" align="right" valign="top"><a href="high-availability.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="MIGRATION">23.5. 在不同版本之间迁移</a></h1><a name="AEN25389"></a><a name="AEN25391"></a>
<p>本节讨论如何把你的数据库数据从一个 PostgreSQL 版本迁移到一个更新的版本上。软件安装步骤本身不是本节的论题；它们的细节在<a href="installation.html">章14</a>里。</p>
<p>通常，不同主版本(第一个点后面的数字变化)的 PostgreSQL 之间的内部存储结构经常做改变。这个情况不会在不同的子版本(第二个点后面的数字变化)里面发生。它们通常用的都是兼容的存储格式。比如，版本 7.2.1, 7.3.2 与 7.4 是不兼容的，而 7.1.1 和 7.1.2 是兼容的。如果你在兼容的版本之间升级，只需要简单地用新的可执行文件替换原来的并且使用原来的磁盘存储区域就行了。否则，你需要用 <span class="APPLICATION">pg_dump</span> 备份数据，然后到新的服务器里恢复它们；文件系统级别的备份明显是不适用的。系统里有一些位置有错误检查，可以防止你使用不兼容的 PostgreSQL 版本的数据区，因此就算混淆这些事情也不会造成什么损害。</p>
<p>我们建议你使用新版本的 <span class="APPLICATION">pg_dump</span> 和 <span class="APPLICATION">pg_dumpall</span> 以便利用新版本的新特性和功能。目前版本的转储程序最老可以支持到 7.0 版本的服务器。</p>
<p>最短停业时间可以这样实现：把新服务器安装在不同的目录然后同时在不同端口运行新旧服务器。这样你就可以用类似</p>
<pre class="PROGRAMLISTING">pg_dumpall -p 5432 | psql -d postgres -p 6543</pre>
<p>这样的命令转移数据，或者用你选择的过渡文件也可以。接着就可以关闭老服务器然后在旧端口启动新服务器。你要确保在你运行完 <span class="APPLICATION">pg_dumpall</span> 之后没有更新旧数据库，否则你显然会丢失那些数据。参阅<a href="client-authentication.html">章20</a>获取如何禁止访问的更多信息。</p>
<p>实际上在完全切换到新库之前可能还要测试客户端应用。这是另外一个同时安装新旧两个服务器的原因。</p>
<p>如果你不能或者不想同时运行两个服务器。可以在安装新服务器之前做好备份，然后停掉旧服务器、移走旧版本、安装新版本、启动新服务器、恢复数据。例如：</p>
<pre class="PROGRAMLISTING">pg_dumpall &gt; backup
pg_ctl stop
mv /usr/local/pgsql /usr/local/pgsql.old
cd ~/postgresql-8.2.3
gmake install
initdb -D /usr/local/pgsql/data
postgres -D /usr/local/pgsql/data
psql -f backup postgres</pre>
<p>参阅<a href="runtime.html">章16</a>里面启动和停止服务器以及其它的细节信息。安装指导里面有执行这些步骤的建议。</p>
<div class="NOTE">
<blockquote class="NOTE">
<p><b>【注意】</b>当你"把旧的安装移走"之后，它就可能不再可以毫无问题地使用了。安装的某些可执行程序包含各种安装的程序和数据文件的绝对路径信息。这通常算不上什么问题，但是如果你计划并行使用两个安装一段时间，你应该在编译的时候给它们赋不同的安装目录。这个问题在 PostgreSQL 8.0 和更新的版本里是可以纠正的，不过在老版本上，你可得小心。</p>
</blockquote>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="warm-standby.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="high-availability.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">高可用性热备份服务器</td><td width="34%" align="center" valign="top"><a href="backup.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">高可用性与负载均衡</td></tr>
</table>
</div>
</body></html>